package metier;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import persistence.dao.ProjetDAO;
import persistence.model.Affectation;
import persistence.model.Projet;
import persistence.model.Tache;
import presentation.beans.AffectationBean;
import presentation.beans.PersonneBean;
import presentation.beans.ProjetBean;
import presentation.beans.RoleBean;
import presentation.beans.TacheBean;

/**
 * @author Ben Une classe en final ne peut �tre dŽrivŽe Une mŽthode en final ne
 *         peut �tre redŽfinie (via override)
 */
public final class ProjetAction {

	/**
	 * 
	 */
	private ProjetDAO projetDAO = ProjetDAO.getInstance();

	/**
	 * @param projetBean
	 * @param personneBean
	 * @return
	 */
	public ProjetBean createProject(ProjetBean projetBean,
			PersonneBean personneBean) {
		Projet projet = new Projet();
		projet = beanToProjet(projetBean);
		projet = projetDAO.createProject(projet);
		RoleAction roleAction = new RoleAction();
		RoleBean role = roleAction.getCP();
		AffectationBean affectationBean = new AffectationBean();
		affectationBean.setPersonne(personneBean);
		affectationBean.setRole(role);
		affectationBean.setProjet(projetToBean(projet));
		affectationBean = affectationBean.doCreateAffectation(affectationBean);
		projetBean = projetToBean(projet);
		projetBean.addAffectation(affectationBean);
		personneBean.addAffectation(affectationBean);
		HttpServletRequest request = (HttpServletRequest) (FacesContext
				.getCurrentInstance().getExternalContext().getRequest());
		request.getSession().setAttribute("user", personneBean);
		return projetBean;
	}

	/**
	 * @param projetBean
	 * @return
	 */
	public boolean updateProject(final ProjetBean projetBean) {
		projetDAO.updateProject(beanToProjet(projetBean));
		return true;
	}

	/**
	 * @param projetBean
	 * @return
	 */
	public static Projet beanToProjet(final ProjetBean projetBean) {
		Projet projet = new Projet();
		final Set<Tache> tache = new HashSet<Tache>();
		final List<TacheBean> taches = new ArrayList<TacheBean>(
				projetBean.getTache());
		projet.setDescriptionProjet(projetBean.getDescriptionProjet());
		projet.setIdProjet(projetBean.getIdProjet());
		projet.setNomProjet(projetBean.getNomProjet());
		for (TacheBean tacheBean : taches) {
			tache.add(TacheAction.beanToTache(tacheBean));
		}
		projet.setTache(tache);
		Set<Affectation> affectation = new HashSet<Affectation>();
		List<AffectationBean> affectations = new ArrayList<AffectationBean>(
				projetBean.getAffectation());
		for (int i = 0; i < affectations.size(); i++)
			affectation.add(AffectationAction.beanToAffectation(affectations
					.get(i)));
		projet.setAffectation(affectation);
		return projet;
	}

	/**
	 * @param projet
	 * @return
	 */
	public static ProjetBean projetToBean(final Projet projet) {
		ProjetBean projetBean = new ProjetBean();
		projetBean.setDescriptionProjet(projet.getDescriptionProjet());
		projetBean.setIdProjet(projet.getIdProjet());
		projetBean.setNomProjet(projet.getNomProjet());
		List<Tache> tache = new ArrayList<Tache>(projet.getTache());
		List<TacheBean> taches = new ArrayList<TacheBean>();
		for (int i = 0; i < tache.size(); i++)
			taches.add(TacheAction.TacheToBean(tache.get(i)));
		projetBean.setTache(taches);
		List<Affectation> affectation = new ArrayList<Affectation>(
				projet.getAffectation());
		List<AffectationBean> affectations = new ArrayList<AffectationBean>();
		for (int i = 0; i < affectation.size(); i++)
			affectations.add(AffectationAction.affectationToBean(affectation
					.get(i)));
		projetBean.setAffectation(affectations);
		return projetBean;
	}

	/**
	 * @param projet
	 * @return
	 */
	public static ProjetBean projetToSimpleBean(final Projet projet) {
		ProjetBean projetBean = new ProjetBean();
		projetBean.setDescriptionProjet(projet.getDescriptionProjet());
		projetBean.setIdProjet(projet.getIdProjet());
		projetBean.setNomProjet(projet.getNomProjet());
		// List<Tache> tache = new ArrayList<Tache>(projet.getTache());
		// List<TacheBean> taches = new ArrayList<TacheBean>();
		// for (int i = 0; i < tache.size(); i++)
		// taches.add(TacheAction.TacheToBean(tache.get(i)));
		// projetBean.setTache(taches);
		return projetBean;
	}

	/**
	 * @param projetBean
	 * @return
	 */
	public static Projet simpleBeanToProjet(final ProjetBean projetBean) {
		Projet projet = new Projet();
		// final Set<Tache> tache = new HashSet<Tache>();
		// final List<TacheBean> taches = new ArrayList<TacheBean>(
		// projetBean.getTache());
		projet.setDescriptionProjet(projetBean.getDescriptionProjet());
		projet.setIdProjet(projetBean.getIdProjet());
		projet.setNomProjet(projetBean.getNomProjet());
		// for (TacheBean tacheBean : taches) {
		// tache.add(TacheAction.beanToTache(tacheBean));
		// }
		// projet.setTache(tache);
		return projet;
	}

	/**
	 * @param projetBean
	 * @return
	 */
	public ProjetBean fetchProjet(final ProjetBean projetBean) {
		Projet projet = new Projet();
		projet = projetDAO.getProjetFromId(ProjetAction
				.beanToProjet(projetBean).getIdProjet());
		return ProjetAction.projetToBean(projet);

	}

	/**
	 * @param projetBean
	 * @return
	 */
	public boolean deleteProject(final ProjetBean projetBean) {
		projetDAO.deleteProject(ProjetAction.beanToProjet(projetBean));
		return true;
	}

}
